package com.shareyi.baseproject.kernel.common.spi.lock;


import com.shareyi.baseproject.kernel.common.exception.LockException;

import java.util.Optional;

/**
 * 分布式锁服务
 *
 * @author david
 * @date 2021/9/1
 */
public interface DistributedLock {
    /**
     * 尝试获取锁
     *
     * @param key        锁的唯一标识
     * @param timeoutSec 锁超时时间(秒)
     * @return 获取锁成功, 则返回锁id. 可通过Optional.isPresent()方法判断是否获取锁成功, true: 成功, false: 失败.
     * @throws LockException 操作锁异常
     */
    Optional<String> tryLock(String key, long timeoutSec) throws LockException;

    /**
     * 尝试获取锁(外部生成uuid),
     *
     * @param key        锁的唯一标识
     * @param uuid       一般用于批量加锁
     * @param timeoutSec 锁超时时间(秒)
     * @return 获取锁成功, 则返回锁id. 可通过Optional.isPresent()方法判断是否获取锁成功, true: 成功, false: 失败.
     * @throws LockException 操作锁异常
     */
    Optional<String> tryLock(String key, String uuid, long timeoutSec) throws LockException;


    /**
     * 释放已持有的锁, 用户应该严格遵循谁获取谁释放.
     *
     * @param key    锁的唯一标识
     * @param lockId 锁id
     * @return true: 解锁成功, false: 释放锁失败. 你可以care解锁结果, 也可以不care. 解锁失败一般是锁id不一致或锁失效引起.
     * @throws LockException 操作锁异常
     */
    boolean unlock(String key, String lockId) throws LockException;
}
